## 实验二十四  HT16K33_8X8点阵模块

![img](./media/wps265.png) 

**实验说明**

什么是点阵？我们用之前的方法一个IO口只能控制一个led，如果需要用更少的IO口控制更多的led怎么办呢，于是就有了点阵。

8X8点阵共由64个发光二极管组成，且每个发光二极管是放置在行线和列线的交叉点上，当对应的某一行置1电平，某一列置0电平，则相应的二极管就亮；如要将第一个点点亮，则1脚接高电平a脚接低电平，则第一个点就亮了。实验中我们用点阵显示一些字符图案图案。

 

**实验原理**

如原理图所示，我们如果想要点亮第一行第一列的那个LED灯，只需要把C1置高电平，R1置电平它就亮了，如果我们想让第一行led全部点亮，那么我们让R1为低电平，C1~C8全部为高电平就可以了，原理非常简单。但是这样的话我们总共需要用到16个IO口，这样就极大的浪费单片机资源。为此，我们特别设计了这个模块，利用HT16K33芯片驱动1个8*8点阵，只需要利用单片机的I2C通信端口控制点阵，大大的节约了单片机资源。

![image-20260421194821929](./media/image-20260421194821929.png)

有些模块上自带3个拨码开关，可以让你随意拨动开关，这是用来设置I2C通信地址的。设置方法如下表格。我们的这个模块中，模块已经固定了通信地址，A0，A1，A2全部接地，即地址为0x70.



| A0（1）  | A1（2）  | A2（3）  | A0（1）  | A1（2）  | A2（3）  | A0（1）  | A1（2）  | A2（3）  |
| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| 0（OFF） | 0（OFF） | 0（OFF） | 1（ON）  | 0（OFF） | 0（OFF） | 0（OFF） | 1（ON）  | 0（OFF） |
| OX70     | OX71     | OX72     |          |          |          |          |          |          |
| A0（1）  | A1（2）  | A2（3）  | A0（1）  | A1（2）  | A2（3）  | A0（1）  | A1（2）  | A2（3）  |
| 1（ON）  | 1（ON）  | 0（OFF） | 0（OFF） | 0（OFF） | 1（ON）  | 1（ON）  | 0（OFF） | 1（ON）  |
| OX73     | OX74     | OX75     |          |          |          |          |          |          |
| A0（1）  | A1（2）  | A2（3）  | A0（1）  | A1（2）  | A2（3）  |          |          |          |
| 0（OFF） | 1（ON）  | 1（ON）  | 1（ON）  | 1（ON）  | 1（ON）  |          |          |          |
| OX76     | OX77     |          |          |          |          |          |          |          |

 

**实验器材**

| ![img](./media/wps267.jpg) | ![img](./media/wps268.jpg) | ![img](./media/wps269.jpg)             | ![img](./media/wps270.png) | ![img](./media/wps271.jpg) |
| -------------------------- | -------------------------- | -------------------------------------- | -------------------------- | -------------------------- |
| Raspberry Pi Pico板*1      | Raspberry Pi Pico扩展板*1  | keyes DIY电 积木 HT16K33_8X8点阵模块*1 | 防反插4Pin*1               | MicroUSB线*1               |

 

 

**接线图**

![img](./media/wps272.png) 

 

  

**测试代码**

```c
/*

  Keyes Starter Kit for Raspberry Pi Pico

  lesson 24

  HT16K33 8\*8 dot matrix

*/

#include <Matrix.h>//点阵的库

 

Matrix myMatrix(20, 21);

uint8_t  LEDArray[8];

 

const uint8_t LedArray1[8] PROGMEM = {0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x66, 0x00};//心形图案

 

void setup() {

 myMatrix.begin(0x70);//iic地址

 myMatrix.clear();//清除显示

 myMatrix.setBrightness(5);//亮度5,范围0~15

}

 

void loop() {

 memcpy_P(&LEDArray, &LedArray1, 8);

 for (int i = 0; i < 8; i++)

 {

  for (int j = 0; j < 8; j++)

  {

   if ((LEDArray[i] & 0x01))

    myMatrix.drawPixel(j, i, 1);

   else

    myMatrix.drawPixel(j, i, 0);

   LEDArray[i] = LEDArray[i] >> 1;

  }

 }

 myMatrix.write(); //显示

 

}
```

**代码说明**

1. 首先我们需要先导入库文件
2. 我们代码中的图案是一个字节数据类型的数组构成，我们在下面的表格上表示出来。

我们将{0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x66, 0x00}转化为二进制，填入下面的8*8表格就清晰了。其中1表示亮，0表示灭，我们可以看到是一个心形。

| 0    | 0    | 0    | 0    | 0    | 0    | 0    | 0    |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| 0    | 0    | 0    | 1    | 1    | 0    | 0    | 0    |
| 0    | 0    | 1    | 1    | 1    | 1    | 0    | 0    |
| 0    | 1    | 1    | 1    | 1    | 1    | 1    | 0    |
| 1    | 1    | 1    | 1    | 1    | 1    | 1    | 1    |
| 1    | 1    | 1    | 1    | 1    | 1    | 1    | 1    |
| 0    | 1    | 1    | 0    | 0    | 1    | 1    | 0    |
| 0    | 0    | 0    | 0    | 0    | 0    | 0    | 0    |

 

**测试结果**

烧录好测试代码，按照接线图连接好线；上电后，点阵显示一个心形图案。

![img](./media/wps273.png)

